package controller;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.apache.commons.io.FilenameUtils;
import org.apache.myfaces.custom.fileupload.UploadedFile;

import pojo.Quangcao;
import util.BeanUtil;
import util.ConvertHelper;
import util.MessageNotificationHepler;
import util.MyHelper;
import util.SearchVisitor;
import dao.QuangcaoDAO;

@ManagedBean(name = "quanLyQuangCaoBean")
@ViewScoped
public class QuanLyQuangCao implements Serializable {

	private static final long serialVersionUID = 1L;
	private List<Quangcao> lstQuangCao;
	private int maQuangCao;
	private String congTy;
	private String link;
	private String hinhAnh;
	private int vungQuangCao;

	private String chuoiTimKiem; // dùng cho action Tìm

	@PostConstruct
	public void init() {
		setLstQuangCao(new ArrayList<Quangcao>());
	}

	public void LietKeToanBo() {
		QuangcaoDAO qcdao = new QuangcaoDAO();
		setLstQuangCao(qcdao.getList());
		System.out.println("Quang cao Xong " + getLstQuangCao().size());
	}

	public void ThemQuangCao() {
		System.out.println("Thêm: " + congTy);

		QuangcaoDAO qcdao = new QuangcaoDAO();
		Quangcao qc = null;
		// Vì ta định nghĩa xóa luôn Quảng cáo nếu trùng, nên ta cần tìm trước
		
		qc = qcdao.GetQuangCaoTaiVung(getVungQuangCao());
		if (null == qc)		
			qc = new Quangcao();

		String nowTime = ConvertHelper.GetNowTime();
		if (uploadedFile == null) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(String
							.format("Hình ảnh chưa được chọn..!!")));
			return;
		} else {
			if (!uploadImage(uploadedFile, nowTime))
				return;
		}

		qc.setCongty(congTy);
		qc.setLink("http://" + link);
		qc.setHinhanh(nowTime + uploadedFile.getName());
		qc.setVungquangcao(vungQuangCao);

		qcdao.saveOrUpdate(qc);		
		
		XoaThongTinDangLuuTru();
		lstQuangCao.add(qc);


		// Update cho LefMenuBean
		((LeftBean) BeanUtil.findBean("leftBean"))
				.ReloadThamSoQuangCao();
		
		FacesContext
				.getCurrentInstance()
				.addMessage(
						null,
						new FacesMessage(
								String.format(
										"Quảng cáo của công ty '%s' tại vùng '%s' đã được tạo thành công!",
										qc.getCongty(), qc.getVungquangcao())));
	}

	public void SuaQuangCao() {
		System.out.println("Sửa: " + congTy);

		QuangcaoDAO qcdao = new QuangcaoDAO();
		Quangcao qc = qcdao.get(getMaQuangCao());

		String nowTime = ConvertHelper.GetNowTime();
		if ((uploadedFile == null)) {

			// Ta Không làm gì cả, vì Null tức là không sửa ảnh
		} else {
			if (!uploadImage(uploadedFile, nowTime))
				return;
		}

		qc.setCongty(congTy);
		qc.setLink("http://" + link);
		if ((uploadedFile != null))
			qc.setHinhanh(nowTime + uploadedFile.getName());
		qc.setVungquangcao(vungQuangCao);

		qcdao.saveOrUpdate(qc);
		XoaThongTinDangLuuTru();

		FacesContext
				.getCurrentInstance()
				.addMessage(
						null,
						new FacesMessage(
								String.format(
										"Quảng cáo của công ty '%s' tại vùng '%s' đã được cập nhật thành công!",
										qc.getCongty(), qc.getVungquangcao())));
	}

	public void XoaThongTinDangLuuTru() {
		setCongTy(null);
		setHinhAnh(null);
		setLink(null);
		setMaQuangCao(-1);
		setVungQuangCao(-1);
		System.out.println("Xóa thông tin !");
	}

	public void TimKiem() {
		System.out.println("Tim Kiếm QC: " + chuoiTimKiem);
		QuangcaoDAO qcdao = new QuangcaoDAO();
		SearchVisitor sv = new SearchVisitor();
		qcdao.accept(sv, chuoiTimKiem);
		lstQuangCao = sv.getResultQuangCao();
		System.out.println("Tim Kiếm KQ: " + lstQuangCao.size());
	}

	public void Xoa(Quangcao qc) {
		System.out.println("Xóa: " + qc.getCongty());
		QuangcaoDAO qcdao = new QuangcaoDAO();
		qcdao.delete(qc);

		lstQuangCao.remove(qc);

		// Update cho LefMenuBean
		((LeftBean) BeanUtil.findBean("leftBean"))
				.ReloadThamSoQuangCao();

		MessageNotificationHepler
				.ShowMessage(String
						.format("Quảng cáo của công ty '%s' tại vùng '%s' đã được Xóa hoàn toàn!",
								qc.getCongty(), qc.getVungquangcao()));
	}

	// Dành cho Upload File
	private UploadedFile uploadedFile;

	public boolean uploadImage(UploadedFile upFile, String nowTime) {

		boolean result = MyHelper.UploadFile(upFile, nowTime, "/Images/Ads/");

		String fileName = FilenameUtils.getName(upFile.getName());
		String contentType = upFile.getContentType();
		// --------------------

		FacesContext
				.getCurrentInstance()
				.addMessage(
						null,
						new FacesMessage(
								String.format(
										"File '%s' với định dạng '%s' đã được upload thành công!",
										nowTime + fileName, contentType)));

		return result;
	}

	public UploadedFile getUploadedFile() {
		return uploadedFile;
	}

	public void setUploadedFile(UploadedFile uploadedFile) {
		this.uploadedFile = uploadedFile;
	}

	// -----------------
	public void SetMaQuangCaoAndGetData(int maQuangCao) {
		setMaQuangCao(maQuangCao);
		QuangcaoDAO qcdao = new QuangcaoDAO();
		Quangcao qc = qcdao.get(maQuangCao);
		setCongTy(qc.getCongty());
		setLink(qc.getLink());
		setHinhAnh(qc.getHinhanh());
		setVungQuangCao(qc.getVungquangcao());
		System.out.println("Lấy thông tin: " + getCongTy());
	}

	// --------------------------
	/**
	 * @return the congTy
	 */
	public String getCongTy() {
		return congTy;
	}

	/**
	 * @param congTy
	 *            the congTy to set
	 */
	public void setCongTy(String congTy) {
		this.congTy = congTy;
	}

	/**
	 * @return the link
	 */
	public String getLink() {
		return link;
	}

	/**
	 * @param link
	 *            the link to set
	 */
	public void setLink(String link) {
		this.link = link;
	}

	/**
	 * @return the hinhAnh
	 */
	public String getHinhAnh() {
		return hinhAnh;
	}

	/**
	 * @param hinhAnh
	 *            the hinhAnh to set
	 */
	public void setHinhAnh(String hinhAnh) {
		this.hinhAnh = hinhAnh;
	}

	/**
	 * @return the vungQuangCao
	 */
	public int getVungQuangCao() {
		return vungQuangCao;
	}

	/**
	 * @param vungQuangCao
	 *            the vungQuangCao to set
	 */
	public void setVungQuangCao(int vungQuangCao) {
		this.vungQuangCao = vungQuangCao;
	}

	/**
	 * @return the lstQuangCao
	 */
	public List<Quangcao> getLstQuangCao() {
		return lstQuangCao;
	}

	/**
	 * @param lstQuangCao
	 *            the lstQuangCao to set
	 */
	public void setLstQuangCao(List<Quangcao> lstQuangCao) {
		this.lstQuangCao = lstQuangCao;
	}

	public String getChuoiTimKiem() {
		return chuoiTimKiem;
	}

	public void setChuoiTimKiem(String chuoiTimKiem) {
		this.chuoiTimKiem = chuoiTimKiem;
	}

	public int getMaQuangCao() {
		return maQuangCao;
	}

	public void setMaQuangCao(int maQuangCao) {
		this.maQuangCao = maQuangCao;
	}

}
